/********************************************************************************
 * @file    atcmd_slave.h
 * @author  jianqiang.xue
 * @Version V1.0.0
 * @Date    2022-09-04
 * @brief   从机版 AT指令 https://lisun.blog.csdn.net/article/details/126683930
 * ATCMD_INIT定义时，要按照下面顺序，不然有可能遍历遗漏。如先检测到'='，直接执行AT+<x>=，导致'=?'被跳过。
 * 测试指令
 * AT+<x>=? 用于枚举可配置的参数
 * 读指令
 * AT+<x>? 用于读取目前配置的参数
 * 写指令
 * AT+<x>=<…> 用于设置参数
 * 执行指令
 * AT+<x> 执行某项指令，比如复位“AT+RESET"。
 ********************************************************************************/

#ifndef __ATCMD_SLAVE_H
#define __ATCMD_SLAVE_H

#include <stdint.h>

#define AT_OK       "\r\nOK\r\n"
#define AT_ERROR    "\r\nERROR\r\n"

typedef struct{
    uint16_t len;  // 数据长度
    uint8_t *data; // 完整参数字符串以/0结尾
    /* 传入回复函数，比如uart0_send，或者ble_send，用于发送不同通道 */
    void (*reply)(uint8_t *data, uint16_t len);
} atcmd_pack_t;

typedef struct{
    char *name;
    int (*callback)(atcmd_pack_t *pack);
} atcmd_info_t;

#define ATCMD_INIT(name, callback)                                     \
    static const atcmd_info_t __atcmd_##callback __attribute__((used)) \
    __attribute__((section(".atcmd."))) = {name, callback}

// 收到数据"AT^"，且末尾为"\r\n"，就传入给改函数。
bool atcmd_msg_handle(atcmd_pack_t *pack);

#endif
